package com.google.code.gronono.commons.exif;

import java.awt.image.BufferedImage;

import com.google.code.gronono.commons.image.ImageUtils;

/**
 * Classe implémentant des méthodes utilitaires pour la manipulation des métadonnées Exif (images de type jpeg).
 *
 * @author gael.lorent-fonfrede
 */
public class ExifUtils {
	/** Type MIME des images JPEG. */
	private static final String JPEG_MIMETYPE = "image/jpeg";

	/**
	 * Cette classe est une classe utilitaire.
	 * Son constructeur ne doit jamais être appelé.
	 * @throws UnsupportedOperationException Toujours.
	 */
	private ExifUtils() {
		throw new UnsupportedOperationException();
	}

	/**
	 * Détermine s'il est nécessaire d'appliquer une rotation.
	 *
	 * @param orientation La valeur du tag d'orientation Exif.
	 * @return <code>true</code> si une rotation est nécessaire, <code>false</code> sinon.
	 */
	public static boolean needsRotation(final Orientation orientation) {
		return ((orientation != null) && (orientation != Orientation.ANGLE_0));
	}

	/**
	 * Fournit une copie éventuellement redressée de l'image fournie en entrée.
	 * <br/>Noter toutefois que même si une rotation est appliquée, les tags Exif (orientation, thumbnail) ne sont pas modifiés.
	 *
	 * @param imageData L'image d'entrée sous forme de flux d'octets.
	 * @param orientation La valeur du tag d'orientation Exif.
	 * @return L'image éventuellement redressée.
	 */
	public static byte[] getRotatedImage(final byte[] imageData, final Orientation orientation) {
		// Si aucune rotation à appliquer on retourne l'image telle quelle
		if (!needsRotation(orientation)) {
			return imageData;
		}

		// Chargement de l'image sous un format permettant la manipulation d'images
		final BufferedImage image = ImageUtils.loadImage(imageData);
		if (image == null) return null;

		// Création d'une copie transformée de l'image d'entrée
		BufferedImage copy = null;
		switch (orientation) {
			case ANGLE_0_MIRROR:
				copy = ImageUtils.transformImage(image, false, false, false, true);
				break;
			case ANGLE_90:
				copy = ImageUtils.transformImage(image, true, true, false, false);
				break;
			case ANGLE_90_MIRROR:
				copy = ImageUtils. transformImage(image, true, false, false, true);
				break;
			case ANGLE_180:
				copy = ImageUtils.transformImage(image, false, false, true, true);
				break;
			case ANGLE_180_MIRROR:
				copy = ImageUtils.transformImage(image, false, false, true, false);
				break;
			case ANGLE_270:
				copy = ImageUtils.transformImage(image, true, false, false, false);
				break;
			case ANGLE_270_MIRROR:
				copy = ImageUtils.transformImage(image, true, true, false, true);
				break;
			default:
				return null;
		}

		// Retourne la copie sous forme de flux d'octets
		if (copy != null) {
			return ImageUtils.getImageBytes(copy, JPEG_MIMETYPE);
		}

		return null;
	}

}
